package objetos;

import DataTypes.*;
import Hndlr.HndlrGrupo;
import Interfaces.Factory;
import enums.enumRol;
import enums.enumVisibilidad;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.JOptionPane;

public class Usuario {
    
    private String correo;
    private String nombre;
    private String nick;
    private String contrasena;
    private Calendar fechaNac;
    private String sexo;
    private String ciudad;
    private String pais;
    private boolean bloqueo;
    private enumVisibilidad nivelVisibilidad;
    private ArrayList<Grupo> grupos;
    private ArrayList<Amistad> amigos;
    private Muro muro;
    private String imagen;
    private HashMap<String,Even> calEventos;
    private boolean cambioPass;
    private boolean notificar;
    private HashMap<String,Historial> historiales;
    private HashMap<String, Usuario> solicitudAmistad;
    
    public Usuario(DataUsuario du) {
        
        ciudad = du.getCiudad();
        contrasena = du.getContrasena();
        correo = du.getCorreo();
        fechaNac = du.getFechaNac();
        nick = du.getNick();
        nivelVisibilidad = du.getNivelVisibilidad();
        nombre = du.getNombre();
        sexo = du.getSexo();
        pais = du.getPais();
        bloqueo = du.getBloqueo();
        grupos = new ArrayList<Grupo>();
        amigos = new ArrayList<Amistad>();
        muro = new Muro();
        imagen = du.getImagen();
        calEventos = new HashMap<String, Even>();        
        cambioPass = du.isCambioPass();
        notificar = du.isNotificar();
        historiales = new HashMap<String, Historial>();
        solicitudAmistad = new HashMap<String, Usuario>();
       
    }
    
    public Usuario() {
        
        this.correo = "gonzalojota";
        this.contrasena = "jota";
        grupos = new ArrayList<Grupo>();
//        amigos = new HashMap<String,Amistad>();
        muro = new Muro();
        cambioPass = false;
        solicitudAmistad = new HashMap<String, Usuario>();
    }

    public HashMap<String, Historial> getHistoriales() {
        return historiales;
    }

    public void setHistoriales(HashMap<String, Historial> historiales) {
        this.historiales = historiales;
    }
    
    public ArrayList<Amistad> getAmigos() {
        return amigos;
    }


    public boolean isNotificar() {
        return notificar;
    }

    public void setNotificar(boolean notificar) {
        this.notificar = notificar;
    }
    
    public HashMap<String, DataEvento> getDataEventos() {
        
        DataEvento dg;
        HashMap<String, DataEvento> listDg = new HashMap<String, DataEvento>();
        Iterator<Even> itera = this.getCalendarioEventos().values().iterator();
        
        while (itera.hasNext()) {
            
            Even e = itera.next();
            dg = new DataEvento(e.getNombre(), e.getTipoEvento(), e.isRepetible(), e.getFecha(), e.getDiasDeSemana(), e.getAutor());
            listDg.put(dg.getNombre(), dg);
        }
        
        return listDg;
        
        
    }

    public void setAmigos(ArrayList<Amistad> amigos) {
        this.amigos = amigos;
    }
    
    public HashMap<String, Even> getCalEventos() {
        return calEventos;
    }
    
    public void setCalEventos(HashMap<String, Even> calEventos) {
        this.calEventos = calEventos;
    }
    
    
    public String getImagen() {
        return imagen;
    }
    
    public void setImagen(String imagen) {
        this.imagen = imagen;
    }
    
    public Muro getMuro() {
        return muro;
    }
    
    public void setMuro(Muro muro) {
        this.muro = muro;
    }
    
    public boolean getBloqueo() {
        return bloqueo;
    }
    
    public void setBloqueo(boolean bloqueo) {
        this.bloqueo = bloqueo;
    }
    
    public String getCiudad() {
        return ciudad;
    }
    
    public String getContrasena() {
        return contrasena;
    }
    
    public String getCorreo() {
        return correo;
    }
    
    public Calendar getFechaNac() {
        return fechaNac;
    }
    
    public String getNick() {
        return nick;
    }
    
    public enumVisibilidad getNivelVisibilidad() {
        return nivelVisibilidad;
    }
    
    public String getNombre() {
        return nombre;
    }
    
    public String getPais() {
        return pais;
    }
    
    public String getSexo() {
        return sexo;
    }
    
    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }
    
    public void setContrasena(String contrasena) {
        this.contrasena = contrasena;
    }
    
    public void setCorreo(String correo) {
        this.correo = correo;
    }
    
    public void setFechaNac(Calendar fechaNac) {
        this.fechaNac = fechaNac;
    }
    
    public void setNick(String nick) {
        this.nick = nick;
    }
    
    public void setNivelVisibilidad(enumVisibilidad nivelVisibilidad) {
        this.nivelVisibilidad = nivelVisibilidad;
    }
    
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    public void setPais(String pais) {
        this.pais = pais;
    }
    
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }
    
    @Override
    public String toString() {
        return this.getCorreo();
    }
    
    public void quitarAmigo(String clave) {
        
        Iterator it = amigos.iterator();
        Amistad amis = null;
        Usuario usu;
        boolean encontro = false;
        while (it.hasNext() && !encontro) {
            amis = (Amistad) it.next();
            usu = amis.getAmigo(this.getCorreo());
            if (usu.getCorreo().equals(clave)) {
                encontro = true;
            }
        }
        if (encontro) {
            amigos.remove(amis);
        } else {
            JOptionPane.showMessageDialog(null, "No tiene ee amigo agregado");
        }

//        return amigos;
    }
//
//    public void setAmigos(HashMap<String,Amistad> amigos) {
////        this.amigos = amigos;
//    }

    public ArrayList<Grupo> getGrupos() {
        return grupos;
    }
    
    public void setGrupos(ArrayList<Grupo> grupos) {
        this.grupos = grupos;
    }
    
    public void agregarGrupo(String gr) {
        
        HndlrGrupo hGrupo = HndlrGrupo.getInstance();
        Grupo g = hGrupo.obtenerGrupo(gr);
        grupos.add(g);
    }
    
    public boolean esAmigo(String clave) {
        
        Iterator<Amistad> it = amigos.iterator();
        Amistad amig;
        boolean esta = false;
        Usuario usu;
        while (it.hasNext() && !esta) {
            amig = it.next();
            usu = amig.getAmigo(this.getCorreo());
            if (usu.getCorreo().equals(clave)) {
                esta = true;
            }
        }
        return esta;
//         if(it.hasNext())
//             return true;
//         else 
//             return false;
    }
    
    public void agregarAmistad(Amistad amigo) {
        
        amigos.add(amigo);
    }
    
    public ArrayList<DataUsuario> listarDAmigos() {
        
        DataUsuario du;
        ArrayList<DataUsuario> listDu = new ArrayList<DataUsuario>();
        Iterator it = amigos.iterator();
        Amistad ami;
        Usuario usu;
        DataUsuario dUsu;
        while (it.hasNext()) {
            ami = (Amistad) it.next();
            usu = ami.getAmigo(this.getCorreo());
            dUsu = new DataUsuario(usu.getCorreo(), usu.getNombre(), usu.getNick(), usu.getContrasena(), usu.getFechaNac(), usu.getSexo(), usu.getCiudad(), usu.getPais(), usu.getBloqueo(), usu.getNivelVisibilidad(), usu.getImagen(), usu.getDataEventos(), usu.getDataAmigos(), usu.getMuro().getDataMuro(),usu.isNotificar(),usu.isCambioPass());
            listDu.add(dUsu);
        }
        return listDu;
    }

//    public void quitarAmigo(Usuario am) {
//        
//        amigos.remove(am.getCorreo());
//        
//    }
    public DataUsuario getDusuario() {
        
        DataUsuario du = new DataUsuario(
                correo,
                nombre,
                nick,
                contrasena,
                fechaNac,
                sexo,
                ciudad,
                pais,
                bloqueo,
                nivelVisibilidad,
                imagen,
                notificar,
                cambioPass);
        
        return du;
    }

    public void agregarEvento(DataEvento even) {
        
        Even ev = new Even(even);
        calEventos.put(ev.getNombre(), ev);
        
    }
    
    public boolean esCreadorGrupo(String correo) {
        boolean es = false;
        Iterator<Grupo> itera = grupos.iterator();
        Grupo gr = null;
        HndlrGrupo hGrupo = HndlrGrupo.getInstance();
        while (!es && itera.hasNext()) {
            gr = itera.next();
            if (hGrupo.PerteneceMiembroAgrupo(correo, gr.getNombre())) {
                //es = true;
                es = gr.obtenerRol(correo).getRolUsr().toString().equals(enumRol.CREADOR.toString());
                
            }
        }
        return es;
        
    }
    
    public void agregarContenidoMuro(Contenido contImg) {
        
        muro.agregarContenido(contImg);
        
    }
    
    public HashMap<String, Even> getCalendarioEventos() {
        
        return calEventos;
    }
    
    public boolean isCambioPass() {
        return cambioPass;
    }
    
    public void setCambioPass(boolean cambioPass) {
        this.cambioPass = cambioPass;
    }
    
    public ArrayList<DataAmistad> getDataAmigos() {
        
        
        ArrayList<DataAmistad> dAmigos = new ArrayList<DataAmistad>();
        
        Iterator<Amistad> it = amigos.iterator();
        Amistad amig;
        DataAmistad dAmig;        
        
        while (it.hasNext()) {
            amig = it.next();
            dAmig = new DataAmistad(amig.getAmigo1().getDusuario(), amig.getAmigo2().getDusuario(), Factory.getInstance().getRelojSistema().getTime());
            dAmigos.add(dAmig);
        }
        return dAmigos;
        
    }
    
    public void etiquetarImagen(String titCont, Calendar fechaPub, ArrayList<String> correoEtiquetado) {
        muro.etiquetarImg(titCont, fechaPub, correoEtiquetado);
    }

    public void quitarEtiquetaImg(String titCont, Calendar fechaPub, String correoEtiquetado) {
        muro.quitarEtiquetaImg(titCont, fechaPub, correoEtiquetado);
    }

    public void activarNotificaciones(boolean activar) {
        notificar = activar;
    }

    public ArrayList<Usuario> listarAmigos() {
        ArrayList<Usuario> listUsr = new ArrayList<Usuario>();
        Iterator<Amistad> it = amigos.iterator();
        
        Amistad ami = null;
        Usuario usu = null;
        
        while (it.hasNext()) {
            ami = it.next();
            usu = ami.getAmigo(this.getCorreo());
            listUsr.add(usu);
        }
        return listUsr;
    }
    
    public void agergarHistorial(String idAmigo,ArrayList<Mensaje>list){
       
        Historial get = historiales.get(idAmigo);
        if(get!=null){
            
            get.agregarHistorial(list);
        }
        else {
            Historial hist = new Historial();
            hist.agregarHistorial(list);
            hist.setIdAmigo(idAmigo);
            historiales.put(idAmigo, hist);
        }
    }

    
    public ArrayList<DataHistorial>getDHistoriales(){
      
        Iterator<Historial> it = historiales.values().iterator();
        ArrayList<DataHistorial> result = new ArrayList<DataHistorial>();
        while(it.hasNext())
        {
            Historial his = it.next();
            DataHistorial dhist = new DataHistorial();
            dhist.setIdAmigo(his.getIdAmigo());
            Iterator<Mensaje> itMens = his.getMensajes().iterator();
            ArrayList<DataMensaje> list = new ArrayList<DataMensaje>();
            while(itMens.hasNext()){
                
                Mensaje men = itMens.next();
                DataMensaje dmen = new DataMensaje(men.getEmisor(), men.getMsj(), men.getFecha());    
                list.add(dmen);
            }
            dhist.setMensajes(list);
            result.add(dhist);
        }
        
       return  result;
        
    }


    public HashMap<String, Usuario> getSolicitudAmistad() {
        return solicitudAmistad;
    }

    public void setSolicitudAmistad(HashMap<String, Usuario> solicitudAmistad) {
        this.solicitudAmistad = solicitudAmistad;
    }

    public void agregarSolicitudAmistad(Usuario usrSolicitante) {
        solicitudAmistad.put(usrSolicitante.getCorreo(), usrSolicitante);
    }

    public boolean existeSolicitudUsuario(String solicitante) {
        return (solicitudAmistad.containsKey(solicitante));
    }

    public void cancelarSolicitudAmistad(String solicitante) {
        solicitudAmistad.remove(solicitante);
    }

    public void quitarSolicitudAmistad(String solicitante) {
        solicitudAmistad.remove(solicitante);
    }

    public int getPromedioPuntaje() {
        return (muro.getPromedioPuntaje());
    }
    

}
